功能
- 处理来自
表示层
的请求,执行业务规则,并与数据访问层
进行交互 - 为
表示层
提供了一个清晰的API接口,同时隐藏了数据访问的细节,使得业务逻辑更加集中和易于管理
处理流程
- 接收请求:表示层控制器会将请求转发给业务逻辑层相应的服务(Service)进行处理。
- 参数验证:业务逻辑层接收到请求后,会对传入的参数进行进一步的验证,确保数据的完整性和合法性。这通常涉及到业务规则的校验,如数据格式、范围、依赖关系等。
- 业务处理:验证通过后,业务逻辑层会执行具体的业务操作。这可能包括复杂的数据计算、调用其他服务、执行特定的业务流程等。业务逻辑层的核心目的是实现应用程序的核心业务功能。
- 数据访问:在执行业务操作的过程中,业务逻辑层通常需要与数据访问层进行交互,以读取或写入数据。它会调用数据访问层的接口,而不直接与数据库打交道。这样的设计可以保证业务逻辑与数据访问的解耦,提高系统的可维护性。
- 事务管理:业务逻辑层还需要处理事务管理,确保一组操作的原子性。
- 返回结果:业务操作完成后,业务逻辑层会构造相应的响应数据,并将其返回给表示层。如果业务操作失败,业务逻辑层还需要负责处理异常,并将错误信息传递回表示层。
事务管理
功能
- 确保一组操作要么全部成功,要么全部失败,以业务操作的ACID特性
- 原子性(Atomicity)
- 一致性(Consistency)
- 隔离性(Isolation)
- 持久性(Durability)
实现
@EnableTransactionManagement
:配置事务管理器,开启事务管理功能
@SpringBootApplication
@EnableTransactionManagement
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@Transactional
:在当前这个方法执行开始之前来开启事务,方法执行完毕之后提交事务。如果在这个方法执行的过程当中出现了异常,就会进行事务的回滚操作
@Service
public class BookService {
@Autowired
private BookRepository bookRepository; // 用于操作数据库的书籍库存
@Autowired
private OrderRepository orderRepository; // 用于操作数据库的订单
@Transactional // 这个方法内的所有操作需要在一个事务中执行
public void createOrder(String bookId, int quantity) {
// 1. 检查库存是否足够
Book book = bookRepository.findById(bookId).orElseThrow(() -> new RuntimeException("Book not found"));
if (book.getStock() < quantity) {
throw new RuntimeException("Not enough stock");
}
// 2. 更新库存
book.setStock(book.getStock() - quantity);
bookRepository.save(book);
// 3. 创建订单
Order order = new Order(book, quantity);
orderRepository.save(order);
}
}
细节
@Transactional
注解书写位置- 方法:当前方法交给 spring 进行事务管理
- 类:当前类中所有的方法都交由 spring 进行事务管理
- 接口:接口下所有的实现类当中所有的方法都交给 spring 进行事务管理
- 在yml配置文件中开启事务管理日志
#spring事务管理日志
logging:
level:
org.springframework.jdbc.support.JdbcTransactionManager: debug
Last updated on